<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
<h3>关于Object.defineProperty()</h3>
<ul>
  <li>语法：Object.defineProperty(obj, prop, descriptor)</li>
  <li>
    <h4>参数：</h4>
    <p>obj -- 要定义属性的对象</p>
    <p>prop -- 要定义或修改的属性的名称或 Symbol </p>
    <p>descriptor -- 要定义或修改的属性描述符</p>
  </li>
</ul>

<h4>描述：</h4>
<p>该方法允许精确地添加或修改对象的属性。通过赋值操作添加的普通属性是可枚举的，在枚举对象属性时会被枚举到（for...in 或 Object.keys 方法），可以改变这些属性的值，也可以删除这些属性。这个方法允许修改默认的额外选项（或配置）。默认情况下，使用 Object.defineProperty() 添加的属性值是不可修改（immutable）的。</p>
<p>对象里目前存在的属性描述符有两种主要形式：数据(数据描述符)属性和访问器(存取描述符)属性。数据描述符是一个具有值的属性，该值可以是可写的，也可以是不可写的。存取描述符是由 getter 函数和 setter 函数所描述的属性。一个描述符只能是这两者其中之一；不能同时是两者。</p>
<ul>
  <li>configurable: 默认为false。为 true 时，该属性的描述符才能够被改变，同时该属性也能从对应的对象上被删除。</li>
  <li>enumerable: 默认为false。为 true 时，该属性才会出现在对象的枚举属性中</li>
  <li>数据描述符可选键值 -- value: 默认为undefined。该属性对应的值。可以是任何有效的 JavaScript 值（数值，对象，函数等）</li>
  <li>数据描述符可选键值 -- writable: 默认为false。为 true 时，属性的值，也就是上面的 value，才能被赋值运算符改变</li>
  <li>（）存取描述符可选键值 -- get:  默认为undefined。属性的 getter 函数，如果没有 getter，则为 undefined。当访问该属性时，会调用此函数。</li>
  <li>存取描述符可选键值 -- set:  默认为undefined。属性的 setter 函数，如果没有 setter，则为 undefined。当属性值被修改时，会调用此函数。</li>
</ul>

<script type="text/javascript">
//https://segmentfault.com/a/1190000011294519?utm_source=tag-newest
//https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty
var obj = {};
var nameValue = '尔都'
Object.defineProperty(obj, 'name', {
  configurable: true,
  enumerable: true,
  /*value: '尔都',
  writable: true*/
  get() {
    return nameValue
  },
  set(v) {
    nameValue = v
  }
})

for (var k in obj) {
  console.log(k)
}

</script>
</body>
</html>